<?php
/**
 * PrynLib
 * @copyright 2007-2009 Prynel
 * @author Olivier ROGER <roger.olivier@gmail.com>
 * @category libPrynel
 * @package Session
 * @version $Revision: 102 $
 */

/**
 *  Wrapper de la gestion de session PHP.
 * 
 * Simplifie l'accès au variable de session via les methodes _get et _set
 * @category libPrynel
 * @package Session
 * @version 1.0.2 
 * @author Olivier ROGER <roger.olivier@gmail.com>
 * @copyright  2007-2009 Prynel
 *       
 *
 */
class Session_Session
{
	/**
	 * Nom de la session
	 *
	 * @var string
	 */
	private $sessionName;
	
	/**
	 * Durée de la session en minute
	 *
	 * @var float
	 */
	private $sessionTTL;
	
	/**
	 * Instance du singleton
	 *
	 * @var Session_Session
	 */
	private static $instance;
	
	/**
	 * Initialisation de la session (Singleton)
	 *
	 * @param string $name
	 * @param float $ttl
	 * @access private
	 */
	private function __construct($name='PrySess',$ttl=null)
	{
		if(isset($_SESSION))
			throw new Util_ExceptionHandler('Une session existe déjà');
			
		$this->sessionName  = $name;
		$this->sessionTTL	= $ttl;	
		session_name($this->sessionName);
		session_start();
		if(!is_null($this->sessionTTL))
		{
			if(empty($_SESSION['ttl']))
				$_SESSION['ttl'] 	= time()+(60*$this->sessionTTL);
		}
		else
		{
			$_SESSION['ttl']	= -1;
		}
	}
	
	/**
	 * Récupère une instance de Session
	 *
	 * @static 
	 * @param string $name
	 * @param float $ttl
	 * @return Session_Session
	 */
	public static function getInstance($name='PrySess',$ttl=null)
	{
		if(!isset(self::$instance))
 		{
 			self::$instance = new Session_Session($name,$ttl);
 		}
 		return self::$instance;
	}
	
	/**
	 * Retourne une variable de session
	 *
	 * @param string $name
	 * @return mixed
	 */
	public function __get($name)
	{
		return $_SESSION[$name];
	}
	
	/**
	 * Surcharge de isset
	 *
	 * @param string $name
	 * @return boolean
	 */
	public function __isset($name)
	{
		return isset($_SESSION[$name]);
	}
	/**
	 * Défini une variable de session
	 *
	 * @param string $name
	 * @param mixed $value
	 */
	public function __set($name,$value)
	{
		$_SESSION[$name] = $value;
	}
	
	/**
	 * Regénère une id de session ainsi que le ttl
	 *
	 * @param boolean $delete_old
	 */
	public function refresh($delete_old = true)
	{
		session_regenerate_id($delete_old);
		if(!is_null($this->sessionTTL))
			$_SESSION['ttl'] 	= time()+(60*$this->sessionTTL);
	}
	
	/**
	 * Vérifie la validité de la session
	 * 
	 * @return boolean
	 */
	public function check()
	{
		$now = time();
		if($_SESSION['ttl'] - $now >0 || is_null($this->sessionTTL))
		{
			$this->refresh();
			return true;
		}
		else
		{
			$this->destroy();
			return false;
		}
	}
	
	/**
	 * Destruction de la session
	 *
	 */
	public function destroy()
	{
		if(isset($_SESSION))
		{
			@session_unset();
			@session_destroy();
		}
	}
}
 ?>